//
//  HomeTableViewController.swift
//  weibo-01
//
//  Created by 韩家奇 on 15/11/3.
//  Copyright © 2015年 hanjiaqi. All rights reserved.
//

import UIKit
import SVProgressHUD
//cell的重用标示
let StatusCellNormalId = "StatusCellNormalId"
/// 转发微博的可重用 ID
let StatusCellRetweetedId = "StatusCellRetweetedId"

class HomeTableViewController: VisitorTableViewController {
    /// 微博数据数组
//    var dataList: [Status]?
    //微博数据列表模型
    private lazy var listViewModel = StatusListViewModel()

    override func viewDidLoad() {
        super.viewDidLoad()

    if !UserAccountViewModel.sharedUserAccount.userLogin {
    
    visitorView?.setupInfo(nil, title: "关注一些人，回这里看看有什么惊喜")
    return
    }
    prepareTableView()
    loadData()
    //注册通知
        // 注册通知 － 如果使用 通知中心的 block 监听，其中的 self 一定要 弱引用！

        NSNotificationCenter.defaultCenter().addObserverForName(WBStatusSelectedPhotoNotification, object: nil, queue: nil)
            {[weak self] (n) -> Void in
                guard let indexPath = n.userInfo?[WBStatusSelectedPhotoIndexPathKey] as? NSIndexPath else {
                    return
                }
                guard let urls = n.userInfo?[WBStatusSelectedPhotoURLsKey] as? [NSURL] else {
                        return
                    }
//                    print(urls)
//                    print(indexPath)
                let vc = pictureBrowserViewController(urls: urls, indexPath: indexPath)
                //modal
                self?.presentViewController(vc, animated: true, completion: nil)
                }
}
    deinit {
        //注销通知
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
    /// 准备表格
    private func prepareTableView() {
        // 注册可重用 cell
        tableView.registerClass(StatusNormalCell.self, forCellReuseIdentifier: StatusCellNormalId)
        tableView.registerClass(StatusRetweetedCell.self, forCellReuseIdentifier: StatusCellRetweetedId)
        
        //取消分割线
        tableView.separatorStyle = .None
        // 临时行高
        // 自动计算行高 - 需要一个自上而下的自动布局的控件，指定一个向下的约束
        
        tableView.estimatedRowHeight = 400
        
        //下拉刷新空间默认没有
        refreshControl = WBRefreshControl()
        //添加监听方法
        refreshControl?.addTarget(self, action:"loadData" , forControlEvents: UIControlEvents.ValueChanged)
        
        // 上拉刷新视图
        tableView.tableFooterView = pullupView

    }

/// 加载数据
@objc private func loadData() {
    refreshControl?.beginRefreshing()
    
    listViewModel.loadStatus(isPullup: pullupView.isAnimating()) { (isSuccessed) -> () in

        //关闭刷新控
        self.refreshControl?.endRefreshing()
        // 关闭上拉刷新
        self.pullupView.stopAnimating()


        if !isSuccessed {
            SVProgressHUD.showInfoWithStatus("加载数据出错,请稍后再试")
            return
        }
//        print(self.listViewModel.statusList)
       // 4. 刷新数据

    self.tableView.reloadData()
    }
    }
    // MARK: - 懒加载控件
    /// 上拉刷新提示视图
    private lazy var pullupView: UIActivityIndicatorView = {
        
        let indicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge)
        indicator.color = UIColor.lightGrayColor()
        
        return indicator
        }()
}
// MARK: - 数据源方法
extension HomeTableViewController {
    
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return listViewModel.statusList.count
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        //1.获取视图模型
        let vm = listViewModel.statusList[indexPath.row]
        
        //2.获取可重用cell会调用行高方法
        let cell = tableView.dequeueReusableCellWithIdentifier(vm.cellId, forIndexPath: indexPath) as! StatusCell
        // 3. 设置视图模型
        cell.viewModle = vm
        // 4. 判断是否是最后一条微博
        if indexPath.row == listViewModel.statusList.count - 1 && !pullupView.isAnimating() {
            // 开始动画
            pullupView.startAnimating()
            
            // 上拉刷新数据
            loadData()

            print("上拉刷新数据")
        }


        return cell
    }
    
//    苹果官方文档有指出，如果行高是固定值，就不要实现行高代理方法！
//    实际开发中，行高一定要缓存！

    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {

        return listViewModel.statusList[indexPath.row].rowHight
    }
}
